TreeviewCopyright © aleen42 all right reserved, powered by aleen42

Dart 的 IO 库中提供了处理 HTTP 的一些类,使用起来也十分简单。

因为是 Dart 自带的,所以无需额外引入其他包,可以直接使用。

创建 HttpClient 对象

    HttpClient client = HttpClient();

创建好 Client,就可以调用一系列方法了,getpostdeleteput 等方法发起请求了。

HttpClient有很多属性可以配置,常用的属性列表如下:

  • idleTimeout,对应请求头中的 keep-alive 字段值,为了避免频繁建立连接,httpClient 在请求结束后会保持连接一段时间,超过这个阈值后才会关闭连接。
  • connectionTimeout,和服务器建立连接的超时,如果超过这个值则会抛出 SocketException 异常。
  • maxConnectionsPerHost,同一个 host,同时允许建立连接的最大数量。
  • autoUncompress,对应请求头中的 Content-Encoding,如果设置为 true,则请求头中 Content-Encoding 的值为当前 HttpClient 支持的压缩算法列表,目前只有 gzip
  • userAgent,对应请求头中的 User-Agent 字段。

这些属性都可以在请求中通过消息头直接设置,区别在于,为 HttpClient 设置对整个 HttpClient 生效,而在请求中设置,只对该请求生效。

get 请求

HttpClient 提供了两个方法来帮助我们完成 get 请求:

  • get

    Future<HttpClientRequest> get(String host, int port, String path)
    

    参数很简单,分别是主机端口和路径。

    HttpClientRequest request = await client.get("www.baidu.com", 80, "");
    
  • getUrl

    Future<HttpClientRequest> getUrl(Uri url);
    

    例子:

    HttpClientRequest request = await client.getUrl(Uri.parse("www.baidu.com"));
    

    如果请求包含参数,则可以通过 Uri 来构建:

    Uri uri=Uri(scheme: "https", host: "flutterchina.club", queryParameters: {
        "xx":"xx",
        "yy":"dd"
      });
    

上面两个方法都可以获取到 HttpClientRequest 对象,然后我们就可以为这个请求设置请求头:

request.headers.add(HttpHeaders.contentTypeHeader, "text/plain");

设置妥当之后,调用 HttpClientRequestclose 方法,该方法会关闭请求,这一步完成后,请求信息就已经发送给服务器了,返回一个HttpClientResponse对象,它包含响应头(header)和响应流(响应体的Stream),接下来就可以通过读取响应流来获取响应内容。

HttpClientResponse response = await request.close();

获得了响应 HttpClientResponse 对象之后,就可以读取响应体了:

String responseBody = await response.transform(utf8.decoder).join();

我们通过读取响应流来获取服务器返回的数据,在读取时我们可以设置编码格式,这里是 utf8

请求结束之后,就可以关闭 Client 了:

client.close();

get 请求示例

    HttpClient client = HttpClient();
    HttpClientRequest request = await client.get("www.baidu.com", 80, "");
    HttpClientResponse response = await request.close();
    if (response.statusCode == 200) {
      String responseBody = await response.transform(utf8.decoder).join();
      print(responseBody);
    }

post 请求

和 get 请求的区别在于,在获取到 HttpClientRequest 对象之后,可以通过 request 来发送请求体:

String string="...";
request.add(utf8.encode(string)); 
//request.addStream(_inputStream); //可以直接添加输入流

results matching ""

    No results matching ""